﻿using System;
using System.IO;
using System.Data;
using System.Windows;
using System.Collections;
using System.Collections.Generic;
using System.Windows.Input;
using System.ComponentModel;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.UI.Controls;
using Sinacor.Infra.UI.Controls.SmartClient;
using Sinacor.Infra.UI.Controls.SmartClient.Validation;
using Sinacor.UI.Bovespa.Corretagem.Model;
using Sinacor.UI.Bovespa.Corretagem.Presenter;

namespace Sinacor.UI.Bovespa.Corretagem.View.SmartClient
{
    public partial class CadastroTiposComissao : SinacorWindow, IFaixaComissao
    {
        #region CadastroTiposComissao

        /// <summary>
        /// Property com a presenter da view
        /// </summary>
        public Presenter.FaixaComissao _faixaComissao { get; set; }
        private bool _isCancelado = false;

        #endregion

         #region Construtor

        /// <summary>
        /// Construtor padrão da view
        /// </summary>
        public CadastroTiposComissao()
        {
            InitializeComponent();

            // Inicialize a presenter no construtor
            this._faixaComissao = new Presenter.FaixaComissao(this);

            // Configure a presenter no DataContext da janela (para facilitar os bindings)
            this.DataContext = this._faixaComissao;

            // Configurando o Type de novos itens da grid, só necessário qunado a grid permitir inclusão
            // Obs: Esta property foi configurada no Code-Behind porque quando configurada no XAML o type
            // não é encontrado.
            this.dtgTipoComissao.NewItemType = typeof(Model.FaixaComissao);

            this.AfterInitialize += new RoutedEventHandler(CadastroTiposComissao_AfterInitialize);
        }

        #endregion

        #region AfterInitialize

        /// <summary>
        /// Evento AfterInitialize
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void CadastroTiposComissao_AfterInitialize(object sender, RoutedEventArgs e)
        {
            this._faixaComissao.Inicializar();
        }

        #endregion

        #region Métodos

        /// <summary>
        /// Método que inclui a faixa de comissão
        /// </summary>
        private bool Incluir()
        {
            this._faixaComissao.NewFaixaComissao = (this.dtgTipoComissao.EditItem as Model.FaixaComissao);
            return this._faixaComissao.IncluirFaixaComissao();
        }

        /// <summary>
        /// Método que altera a faixa de comissão
        /// </summary>
        private bool Alterar()
        {
            this._faixaComissao.NewFaixaComissao = (this.dtgTipoComissao.EditItem as Model.FaixaComissao);
            return this._faixaComissao.AlterarFaixaComissao();
        }

        #endregion

        #region Eventros da Datagrid

        /// <summary>
        /// Deleta o item selecionado
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dtgTipoComissao_Deleting(object sender, CancelItemsEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                Model.FaixaComissao faixaComissao = (this.dtgTipoComissao.SelectedItem as Model.FaixaComissao);

                Model.Parameter.FiltroFaixaComissaoChave faixaComissaoChave = new Model.Parameter.FiltroFaixaComissaoChave()
                {
                    NumeroFaixa = (faixaComissao.NumeroFaixa.HasValue ? faixaComissao.NumeroFaixa.Value : 0)
                };

                this._faixaComissao.FaixaComissaoChave = faixaComissaoChave;

                if (!this._faixaComissao.ExcluirFaixaComissao())
                {
                    e.Cancel = true;
                }
            }
        }

        /// <summary>
        /// Inclui o novo item
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dtgTipoComissao_EndingInsert(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is InsertionRow)
            {
                this.ClearServiceErrors();

                bool isChangingLine = this.dtgTipoComissao.SelectionChanging;

                if (isChangingLine)
                {
                    if ((SinacorMessageBox.Show(FindResource("Bovespa.Corretagem.Message.SalvarAlteracoesAntes").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question) == SinacorMessageBoxResult.Yes))
                    {
                        if (!this.Incluir())
                        {
                            e.Cancel = true;
                        }
                    }
                    else
                    {
                        this.dtgTipoComissao.CancelInsert();
                        this.dtgTipoComissao.SelectedIndex = ((MultiSelector)(e.Source)).SelectedItems.Count;
                        this._isCancelado = true;
                        e.Cancel = true;
                    }
                }
                else
                {
                    if (!this.Incluir())
                    {
                        e.Cancel = true;
                    }
                }
            }
        }

        /// <summary>
        /// Altera o item selecionado
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dtgTipoComissao_EndingUpdate(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.ClearServiceErrors();

                bool isChangingLine = this.dtgTipoComissao.SelectionChanging;

                if (isChangingLine)
                {
                    if ((SinacorMessageBox.Show(FindResource("Bovespa.Corretagem.Message.SalvarAlteracoesAntes").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question) == SinacorMessageBoxResult.Yes))
                    {
                        if (!this.Alterar())
                        {                            
                            e.Cancel = true;
                        }
                    }
                    else
                    {
                        this.dtgTipoComissao.CancelUpdate();
                        this.dtgTipoComissao.SelectedIndex = ((MultiSelector)(e.Source)).SelectedItems.Count;
                        this._isCancelado = true;
                        e.Cancel = true;
                    }
                }
                else
                {
                    if (!this.Alterar())
                    {
                        e.Cancel = true;
                    }
                }
            }
        }

        /// <summary>
        /// Mudança de célula corrente
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dtgTipoComissao_CurrentCellChanged(object sender, CurrentCellChangedEventArgs e)
        {
            if (e.OldCell != null)
            {
                //Se não é a mesma linha então dispara os eventos de finalização
                if (e.OldCell.Row.Index != e.NewCell.Row.Index && _isCancelado == false)
                {
                    this.dtgTipoComissao.SelectItem(e.ItemInfo.Index);
                }
                //Mantem selecionada a nova linha clicada quando é update
                if (this._isCancelado)
                {
                    this.dtgTipoComissao.SelectItem(e.OldCell.Row.Index);
                    this._isCancelado = false;
                }
            }
        }

        /// <summary>
        /// Cancelando a inclusão
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dtgTipoComissao_CancelingInsert(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.ClearServiceErrors();
            }
        }

        /// <summary>
        /// Cancelando a alteração
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dtgTipoComissao_CancelingUpdate(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.ClearServiceErrors();
            }
        }

        /// <summary>
        /// Item incluído
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dtgTipoComissao_InsertEnded(object sender, ItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.ClearServiceErrors();
            }
        }

        /// <summary>
        /// Item alterado
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dtgTipoComissao_UpdateEnded(object sender, ItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.ClearServiceErrors();
            }
        }

        #endregion

        #region Validar DataGrid

        /// <summary>
        /// Evento que valida a faixa de números que é de 1 à 999
        /// </summary>
        /// <param name="sender">Object</param>
        /// <param name="e">ValidatingEventArgs</param>
        private void ValidaNumeroFaixa_Validating(object sender, ValidatingEventArgs e)
        {
            // Marca validation result como válido
            ValidationResult validationResult = ValidationResult.ValidResult;

            // Verifica se a data de referência não está nulo
            if (e.Value != null)
            {
                // Se não estiver, valida a data de referência
                int numeroFaixa = Convert.ToInt32(e.Value);

                if (numeroFaixa < 1 || numeroFaixa > 999)
                {
                    validationResult = new ValidationResult(false, "Bovespa.Corretagem.Message.NumeroFaixaNaoPodeSerZero");
                }
            }

            // Retorna o resultado da validação
            e.Result = validationResult;
        }

        #endregion

        #region IFaixaComissao Members

        #region AtualizarListaFaixaComissao

        public void AtualizarListaFaixaComissao()
        {
            this.dtgTipoComissao.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        #endregion

        #region AtualizarListaFaixaComissao

        public void AtualizarNumeroFaixaComissao()
        {
            Model.FaixaComissao faixaComissao = this.dtgTipoComissao.EditItem as Model.FaixaComissao;

            if (faixaComissao != null)
            {
                faixaComissao.NumeroFaixa = this._faixaComissao.FaixaComissaoChave.NumeroFaixa;
            }            
        }

        #endregion

        #region ConfirmarExclusaoFaixaComissao

        public bool ConfirmarExclusaoFaixaComissao()
        {
            bool isExclui = false;

            SinacorMessageBoxResult result = SinacorMessageBox.Show(FindResource("Bovespa.Corretagem.Message.ExcluirFaixaComissao").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

            if (result == SinacorMessageBoxResult.Yes)
            {
                isExclui = true;
            }

            return isExclui;
        }

        #endregion

        #region InformarAlteracaoRealizada

        public void InformarAlteracaoRealizada()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Corretagem.Message.AlteracaoRealizadaSucesso").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Exclamation);
        }

        #endregion

        #region InformarExclusaoRealizada

        public void InformarExclusaoRealizada()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Corretagem.Message.ExclusaoRealizadaSucesso").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Exclamation);
        }

        #endregion

        #region InformarInclusaoRealizada

        public void InformarInclusaoRealizada()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Corretagem.Message.InclusaoRealizadaSucesso").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Exclamation);
        }

        #endregion

        #endregion
    }
}
